﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Grishko.DataTier;
using OutdoorLib.BaseEntity.Constraction;
using OutdoorLib.BaseEntity.Face;
using OutdoorLib.BaseEntity.Contract;
using OutdoorLib.Context;

namespace OutdoorLib.BaseEntity.Infrastructure
{
    /// <summary>
    /// Проверка бизнесс правил
    /// </summary>
    public class TBusinessRules:EntitySingle 
    {
        public List<string> CheckUpdate(Entity obj)
        {
            string TagName = obj.TagName.ToUpper();
            switch (TagName) 
            {
                case "CONSTRACTION":
                    return CheckUpdateConstraction(obj);
                
                case "EMPLOYEER":
                    return CheckUpdateEmployeer(obj);
                    
                case "CONTRACT":
                    return CheckUpdateContract(obj);

                case "CLIENT":
                    return CheckUpdateClient(obj);
        
            }
            
            List<string> res = new List<string>();
            return res;
        }
        /// <summary>
        /// ПАроверить правила удаления
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public List<string> CheckDelete(Entity obj)
        {
            List<string> res = new List<string>();
            return res;
        }
        /// <summary>
        /// Установка значений по умолчанию
        /// </summary>
        /// <param name="obj"></param>
        public void SetDefaultValue(Entity obj,object[] Params)
        {
            if (String.CompareOrdinal(obj.TagName, "Constraction") == 0)
                SetDefaultValueConstraction(obj,Params);

            if (String.CompareOrdinal(obj.TagName, "Side") == 0)
                SetDefaultValueSide(obj, Params);

            if (String.CompareOrdinal(obj.TagName, "Contract") == 0)
                SetDefaultValueContract(obj, Params);

            if (String.CompareOrdinal(obj.TagName, "Client") == 0)
                SetDefaultValueClient(obj, Params);

        }

        #region Constraction
        /// <summary>
        /// Требования к конструкции
        /// 1. номер - не пусто
        /// 2. улица - не пусто
        /// 3.адрпесная программа не пусто
        /// 4. номер уникален        
        /// 
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        protected virtual List<string>  CheckUpdateConstraction(Entity obj)
        {
            string SqlNumberExists= "select count(*) from vSrchObjectPropertyStorage where not ObjectID ='{0}' and 	PropertyName ='Number'  and 	PropertyValue ='{1}' and TagName='Constraction'";	

            List<string> res = new List<string>();
            ConstractionEntity constr = (ConstractionEntity)obj;
            if (String.IsNullOrEmpty(constr.Number))
                res.Add("Номер - параметр  не указан" );

            string[] SqlParams={constr.ID ,constr.Number};
            object isExistst = SqlTools.ExecuteSqlText(string.Format(SqlNumberExists,SqlParams)); 
            if (((int)isExistst )>0)
                res.Add("Номер - параметр  не уникален");

            if (null == constr.ConstractionType)
                res.Add("Тип конструкции - параметр  не указан");


            if (String.IsNullOrEmpty(constr.Street))
                res.Add("Улица - параметр  не указан" );

            if (null==constr.AdressProgramm )
                res.Add("Адресная программа - параметр  не указан" );

            if (constr.dtCreate >constr.dtDestroy )
                res.Add("Дата демонтажа меньше  даты монтажа" );

            foreach (Side item in constr.SideList)
            {
                res.AddRange(CheckUpdateSide(item));
            }

            return res;
        }        
        
        /// <summary>
        /// Требования к стороне:
        /// 1.количество поверхностей >0
        /// 2.GRP не более 0-1
        /// 3.OTS не более 1-100
        /// 4. Видимость 25-500
        /// 5.Литера - заполнена
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        protected virtual List <string> CheckUpdateSide(Entity obj)
        {
            List<string> res = new List<string>();
            Side _Side = (Side)obj;
            if(string .IsNullOrEmpty ( _Side.Litera ))
                res.Add("Литера стороны не указана" );

            if (_Side.SurfaceCount <1)
                res.Add("Количество поверхностей - ошибочное значение параметра" );

            if (_Side.GRP < 0 || _Side.GRP>1)
                res.Add("Параметр GRP должен находиться в диапазоне 0-1" );

            if (_Side.OTS < 0 || _Side.OTS > 100)
                res.Add("Параметр OTS должен находиться в диапазоне 0-100" );

            if (_Side.LookDistance  < 0 || _Side.LookDistance > 500)
                res.Add("Параметр Дистанция видимости  должен находиться в диапазоне 0-500" );

            return res;

        }
        
        protected virtual List<string> CheckDeleteConstraction(Entity obj)
        {
            List<string> res = new List<string>();
            return res;
        }

        
        protected virtual void SetDefaultValueConstraction(Entity obj,object[] Params )
        {

        }
        /// <summary>
        /// Количество поверхностей=1
        /// Буква соответсвует номеру стороны
        /// </summary>
        /// <param name="obj"></param>
        protected virtual void SetDefaultValueSide(Entity obj, object [] Params)
        {
            Side _Side = (Side)obj;
            ConstractionEntity _ConstractionEntity = (ConstractionEntity)Params[0];
            /// Диапазон литер для стороны        
            string[] Liters = { "A", "B", "C", "D", "E", "F" };
            _Side.Litera = Liters[_ConstractionEntity.SideList.Count];
            
                }
        #endregion

        #region Employeer
        /// <summary>
        /// Требования к конструкции
        /// 1. номер - не пусто
        /// 2. улица - не пусто
        /// 3.адрпесная программа не пусто
        /// 4. номер уникален        
        /// 
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        protected virtual List<string> CheckUpdateEmployeer(Entity obj)        
        {   
            List<string> res = new List<string>();
            Employeer Empl = (Employeer)obj;
            if (String.IsNullOrEmpty(Empl.FirstName ))
                res.Add("Фамилия - параметр  не указан");

            if (Empl.eMail.IndexOf ("@")==-1)
                res.Add("eMail - параметр  не указан");

            return res;
        }
        #endregion

        #region Contract
        /// <summary>
        /// Требования к конструкции
        /// 1. номер - не пусто
        /// 2. номер уникален        
        /// 3.клиент - не пусто
        /// 
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        protected virtual List<string> CheckUpdateContract(Entity obj)
        {
            string SqlNumberExists = "select count(*) from vSrchObjectPropertyStorage where not ObjectID ='{0}' and 	PropertyName ='Number'  and 	PropertyValue ='{1}' and TagName ='Contract'";

            List<string> res = new List<string>();
            ContractEntity contract = (ContractEntity)obj;
            if (String.IsNullOrEmpty(contract.Number))
                res.Add("Номер - параметр  не указан");

            if (null==contract .ContractStatus)
                res.Add("Статус - параметр  не указан");

            string[] SqlParams = { contract.ID, contract.Number };
            object isExistst = SqlTools.ExecuteSqlText(string.Format(SqlNumberExists, SqlParams));
            if (((int)isExistst) > 0)
                res.Add("Номер - параметр  не уникален");

            if (null == contract .Client)
                res.Add("Клиент- параметр  не указан");
            
            return res;
        }

        /// <summary>
        /// Статус контракт по умолчанию = прототип с датой = + 10 дней
        /// номер - количество контрактов +1
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="Params"></param>
        public virtual void SetDefaultValueContract(Entity obj, object[] Params)
        {
            object number=SqlTools.ExecuteSqlText("select COUNT (*) from vSrchObjectPropertyStorage where TagName ='Contract' and PropertyName='Number'");

            ContractEntity _Contract = (ContractEntity)obj;
            _Contract.Number = number.ToString ();

            if (null == _Contract.ContractStatus)
            {
                _Contract.ContractStatus = TContractStatus.GetStatus(TContractStatus.Prototype );
                _Contract.ContractStatus.Date = DateTime.Now.AddDays(5);
            }




        }


        #endregion

        #region Client
        /// <summary>
        /// Требования к клиенту:
        /// Наименование - не пусто
        /// Наименование - уникально 
        /// Куратор присутсвует
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        protected virtual List<string> CheckUpdateClient(Entity obj)
        {
            string SqlNumberExists = "select count(*) from vSrchObjectPropertyStorage where not ObjectID ='{0}' and 	PropertyName ='Name'  and 	PropertyValue like '{1}' and TagName ='Client'";

            List<string> res = new List<string>();
            Client  client= (Client)obj;
            if (String.IsNullOrEmpty(client.FullName))
                res.Add("Наименование - параметр  не указан");

            
            if (null==client.Curator)
                res.Add("Наименование - параметр  не указан");

            string[] SqlParams = { client.ID, "%"+ client.FullName+"%"};
            object isExistst = SqlTools.ExecuteSqlText(string.Format(SqlNumberExists, SqlParams));
            if (((int)isExistst) > 0)
                res.Add("Наименование- параметр  не уникален");

            
            return res;

        }

        /// <summary>
        /// По умолчанию - куратор = текущий пользователь
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="Params"></param>
        public virtual void SetDefaultValueClient(Entity obj, object[] Params)
        {
            Client  _Client= (Client)obj;

            if (null == _Client.Curator )
            {
                _Client.Curator = AgencyLib_GlobalConstants.CurrentEmployeer;                
            }


        }
        #endregion

    }
}
